#ifndef IMAGEPROCESSINGMANAGERPLUGIN_H
#define IMAGEPROCESSINGMANAGERPLUGIN_H
#include <QObject>
#include <QVariant>
#include "CameraPluginInterface.h"
#include "ImageProcessingWidget.h"
#include "ImageAlgorithmManager.h"

/**
 * @class ImageProcessingAlgorithmManagerPlugin
 * @brief 图像处理算法管理插件类
 * 
 * 该类继承自CameraPluginInterface，用于管理和协调各种图像处理算法的执行
 * 负责初始化UI组件、加载算法、处理图像处理请求以及与其他插件通信
 */
class ImageProcessingAlgorithmManagerPlugin :public CameraPluginInterface {
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PLUGIN_METADATA(IID "Camera.CameraPluginInterface/1.0")
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针
     */
    Q_INVOKABLE explicit ImageProcessingAlgorithmManagerPlugin(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     * 清理动态分配的资源，包括UI组件和算法管理器
     */
    ~ImageProcessingAlgorithmManagerPlugin() override;

    /**
     * @brief 初始化插件
     * 创建UI组件、初始化算法管理器并连接必要的信号槽
     */
    void initialize() override;
    
    /**
     * @brief 获取插件名称
     * @return 插件名称字符串
     */
    QString pluginName() const override;
    
    /**
     * @brief 获取插件描述
     * @return 插件描述字符串
     */
    QString description() const override;
public slots:
    /**
     * @brief 通用消息接收槽（支持跨插件调用）
     * @param sender 发送消息的插件名称
     * @param message 消息内容
     * 处理来自其他插件的消息，如图像选择变更通知
     */
    virtual void onPluginMessage(const QString& sender, const QString& message) override;
    
    /**
     * @brief 处理特定图像的方法（由图像管理插件调用）
     * @param imageGuid 图像的唯一标识符
     * @param algorithmName 要使用的算法名称
     * @param parameters 图像处理的参数
     * @return 处理结果，成功返回true，失败返回false
     */
    Q_INVOKABLE QVariant processSpecificImage(const QVariant& imageGuid, const QVariant& algorithmName, const QString &parameters);

private slots:
    /**
     * @brief 处理图像处理完成信号
     * @param imageId 处理完成的图像ID
     * @param processedImage 处理后的图像数据
     * @param algorithmName 使用的算法名称
     * @param isPretreatment 是否是预处理
     * 接收算法处理完成的通知并执行后续操作
     */
    void onImageProcessingCompleted(const QString& imageId, const QImage& processedImage, const QString& algorithmName, bool isPretreatment);

    /**
     * @brief 处理图像请求的槽函数
     * @param algorithmName 要使用的算法名称
     * 触发指定算法对当前选中图像的处理
     */
    void onProcessImageRequest(const QString& algorithmName);

private:
    /**
     * @brief 改变选择的图像
     * @param imageGuid 新选择图像的GUID
     * 根据选中的图像更新UI状态和算法处理状态
     */
    void changeSelectImage(const QString& imageGuid);

private:
    /**
     * @brief 图像处理UI组件指针
     */
    ImageProcessingWidget *m_pImageProcessingWidget;
    
    /**
     * @brief 图像算法管理器指针
     */
    ImageAlgorithmManager *m_pImageAlgorithmManager;

};

#endif // IMAGEPROCESSINGMANAGERPLUGIN_H
